package com.lancoo.ccas52.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.lancoo.ccas52.config.MybatisRedisCache;
import com.lancoo.ccas52.entity.Course;
import com.lancoo.ccas52.pojo.common.GroupObject;
import com.lancoo.ccas52.pojo.vo.*;
import org.apache.ibatis.annotations.CacheNamespace;
import org.apache.ibatis.annotations.Param;

import java.util.Collection;
import java.util.List;

/**
 * <p>
 * 课程 Mapper 接口
 * </p>
 *
 * @author quin.song
 * @since 2023-01-03
 */
@CacheNamespace(implementation = MybatisRedisCache.class, eviction = MybatisRedisCache.class)
public interface CourseMapper extends BaseMapper<Course> {

    int addBatch(@Param("courseCollection") Collection<Course> courseCollection);

    List<CollegeDto> getCollegeByTaskId(@Param("taskId") Integer taskId);

    /**
     * 获取课程类别
     *
     * @param taskId
     * @return
     */
    List<CourseTypeDto> getCourseTypeByTaskId(@Param("taskId") Integer taskId);


    /**
     * @param taskId
     * @param page
     * @param applyStatus
     * @param courseTypeId
     * @param courseNature
     * @param collegeId
     * @param keyWord
     * @return
     */
    IPage<CourseApplyDto> getCourseByConditions(@Param("taskId") Integer taskId, @Param("page") IPage page, @Param("applyStatus") Integer applyStatus, @Param("courseTypeId") String courseTypeId,
                                                @Param("courseNature") Integer courseNature,@Param("majorProp") Integer majorProp, @Param("collegeId") String collegeId, @Param("keyWord") String keyWord);

    /**
     * 获取课程申请信息用于统计数量
     * @param taskId
     * @return
     */
    List<CourseApplyDto> getCourseApply(@Param("taskId") Integer taskId);

    /**
     * 获取未启用且没有申请增加的课程
     *
     * @param taskId
     * @param courseTypeId
     * @param courseNature
     * @param collegeId
     * @param keyWord
     * @return
     */
    List<Course> getNotIsEnableApplyCourse(@Param("taskId") Integer taskId, @Param("courseTypeId") String courseTypeId,
                                           @Param("courseNature") Integer courseNature,@Param("majorProp") Integer majorProp, @Param("collegeId") String collegeId, @Param("keyWord") String keyWord);

    /**
     * 获取分组统计信息
     *
     * @param taskId
     * @param applyStatus
     * @param courseTypeId
     * @param courseNature
     * @param collegeId
     * @return
     */
    List<GroupObject<Number, Number>> getCourseApplyStatistics(@Param("taskId") Integer taskId, @Param("applyStatus") Integer applyStatus, @Param("courseTypeId") String courseTypeId,
                                                               @Param("courseNature") Integer courseNature,@Param("majorProp") Integer majorProp, @Param("collegeId") String collegeId);

    /**
     * @param taskId
     * @return
     */
    List<GroupObject<Integer, Long>> getPublishStatistics(@Param("taskId") Integer taskId);

    /**
     * 条件查询预选课的课程
     *
     * @param taskId
     * @param page
     * @param studyNature
     * @param courseTypeId
     * @param courseNature
     * @param collegeId
     * @param keyWord
     * @param state
     * @return
     */
    IPage<CoursePlanDto> getCourseAndPreSelect(@Param("taskId") Integer taskId, @Param("page") IPage page, @Param("studyNature") Integer studyNature, @Param("courseTypeId") String courseTypeId,
                                           @Param("courseNature") Integer courseNature ,@Param("majorProp") Integer majorProp, @Param("collegeId") String collegeId, @Param("keyWord") String keyWord, @Param("state") Integer state);

    /**
     * 获取预选课设置情况
     * @param taskId
     * @return
     */
    PreCourseConfiguredVo getPreCourseConfiguredVo(@Param("taskId") Integer taskId);
    /**
     * 条件查询教学计划对应课程
     * @param taskId
     * @param page
     * @param studyNature
     * @param courseTypeId
     * @param courseNature
     * @param collegeId
     * @param keyWord
     * @param state 不传类似查询全部 可以复用
     * @return
     */
    IPage<CoursePlanDto> getCoursePlanAndCourseWeek(@Param("taskId") Integer taskId, @Param("page") IPage page, @Param("studyNature") Integer studyNature, @Param("courseTypeId") String courseTypeId,
                                                    @Param("courseNature") Integer courseNature,@Param("majorProp") Integer majorProp, @Param("collegeId") String collegeId, @Param("keyWord") String keyWord, @Param("uniqueShiftSign") Integer uniqueShiftSign,@Param("state") Integer state);
    /**
     * 条件查询正式选课的课程
     * todo CoursePlanDto
     * @param taskId
     * @param page
     * @param studyNature
     * @param courseTypeId
     * @param courseNature
     * @param collegeId
     * @param keyWord
     * @return
     */
    IPage<CoursePlanDto> getFormalCourseBySelect(@Param("taskId") Integer taskId, @Param("page") IPage page, @Param("studyNature") Integer studyNature, @Param("courseTypeId") String courseTypeId,
                                           @Param("courseNature") Integer courseNature,@Param("majorProp") Integer majorProp, @Param("collegeId") String collegeId, @Param("keyWord") String keyWord);

    /**
     * 获取已预选的课程
     *
     * @param taskId
     * @param page
     * @param studyNature
     * @param courseTypeId
     * @param courseNature
     * @param collegeId
     * @param keyWord
     * @param state
     * @return
     */
    IPage<CoursePlanDto> getPreSelect(@Param("taskId") Integer taskId, @Param("page") IPage page, @Param("studyNature") Integer studyNature, @Param("courseTypeId") String courseTypeId,
                                  @Param("courseNature") Integer courseNature,@Param("majorProp") Integer majorProp, @Param("collegeId") String collegeId, @Param("keyWord") String keyWord, @Param("state") Integer state);

    /**
     * 获取课程-教学班设置
     * @param taskId
     * @param page
     * @param studyNature
     * @param courseTypeId
     * @param courseNature
     * @param collegeId
     * @param keyWord
     * @param state
     * @param teachingClassType
     * @return
     */
    IPage<CoursePlanDto> getCoursePlanAndTeachingClass(@Param("taskId") Integer taskId, @Param("page") IPage page, @Param("studyNature") Integer studyNature, @Param("courseTypeId") String courseTypeId,
                                  @Param("courseNature") Integer courseNature,@Param("majorProp") Integer majorProp, @Param("collegeId") String collegeId, @Param("keyWord") String keyWord, @Param("state") Integer state,
                                                       @Param("teachingClassType")Integer teachingClassType,@Param("uniqueShiftSign") Integer uniqueShiftSign);

    /**
     * 获取可拆班课程
     * @param taskId
     * @return
     */
    List<SubCourseVo> getSubCourse(@Param("taskId") Integer taskId, @Param("collegeId") String collegeId,@Param("majorProp") Integer majorProp);
    /**
     * 统计教学任务 课程相关数量
     * @param taskId
     * @return
     */
    List<CoursePlanDto> courseStatistics(@Param("taskId") Integer taskId);

    /**
     * 获取教学计划课程
     * @param taskId
     * @return
     */
    List<CoursePlanDto> getCoursePlan(@Param("taskId") Integer taskId);


}
